#pragma once
#include <memory>
#include "Core.h"

#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"

namespace Panda{

	class PANDA_API Log
	{
	public:
		static void Init();
		inline static std::shared_ptr<spdlog::logger>& GetCoreLogger() { return s_CoreLogger; }

		inline static std::shared_ptr<spdlog::logger>& GetClientLogger() { return s_ClientLogger; }

	private:
		static std::shared_ptr<spdlog::logger> s_CoreLogger;
		static std::shared_ptr<spdlog::logger> s_ClientLogger;
	};

}

#define PANDA_CORE_TRACE(...)		::Panda::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define PANDA_CORE_DEBUG(...)		::Panda::Log::GetCoreLogger()->debug(__VA_ARGS__)
#define PANDA_CORE_INFO(...)		::Panda::Log::GetCoreLogger()->info(__VA_ARGS__)
#define PANDA_CORE_WARN(...)		::Panda::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define PANDA_CORE_ERROR(...)		::Panda::Log::GetCoreLogger()->error(__VA_ARGS__)
#define PANDA_CORE_CRITICAL(...)	::Panda::Log::GetCoreLogger()->critical(__VA_ARGS__)

#define PANDA_TRACE(...)			::Panda::Log::GetClientLogger()->trace(__VA_ARGS__)
#define PANDA_DEBUG(...)			::Panda::Log::GetClientLogger()->debug(__VA_ARGS__)
#define PANDA_INFO(...)				::Panda::Log::GetClientLogger()->info(__VA_ARGS__)
#define PANDA_WARN(...)				::Panda::Log::GetClientLogger()->warn(__VA_ARGS__)
#define PANDA_ERROR(...)			::Panda::Log::GetClientLogger()->error(__VA_ARGS__)
#define PANDA_CRITICAL(...)			::Panda::Log::GetClientLogger()->critical(__VA_ARGS__)


/*
#ifdef PANDA_ENABLE_LOG
    #define PANDA_CORE_TRACE(...)     ::Panda::Log::GetCoreLogger()->trace(__VA_ARGS__)
    #define PANDA_CORE_DEBUG(...)     ::Panda::Log::GetCoreLogger()->debug(__VA_ARGS__)
    #define PANDA_CORE_INFO(...)      ::Panda::Log::GetCoreLogger()->info(__VA_ARGS__)
    #define PANDA_CORE_WARN(...)      ::Panda::Log::GetCoreLogger()->warn(__VA_ARGS__)
    #define PANDA_CORE_ERROR(...)     ::Panda::Log::GetCoreLogger()->error(__VA_ARGS__)
    #define PANDA_CORE_CRITICAL(...)  ::Panda::Log::GetCoreLogger()->critical(__VA_ARGS__)

    #define PANDA_TRACE(...)          ::Panda::Log::GetClientLogger()->trace(__VA_ARGS__)
    #define PANDA_DEBUG(...)          ::Panda::Log::GetClientLogger()->debug(__VA_ARGS__)
    #define PANDA_INFO(...)           ::Panda::Log::GetClientLogger()->info(__VA_ARGS__)
    #define PANDA_WARN(...)           ::Panda::Log::GetClientLogger()->warn(__VA_ARGS__)
    #define PANDA_ERROR(...)          ::Panda::Log::GetClientLogger()->error(__VA_ARGS__)
    #define PANDA_CRITICAL(...)       ::Panda::Log::GetClientLogger()->critical(__VA_ARGS__)
#else
    // 日志关闭时，全部宏定义为空操作
    #define PANDA_CORE_TRACE(...)
    #define PANDA_CORE_DEBUG(...)
    #define PANDA_CORE_INFO(...)
    #define PANDA_CORE_WARN(...)
    #define PANDA_CORE_ERROR(...)
    #define PANDA_CORE_CRITICAL(...)

    #define PANDA_TRACE(...)
    #define PANDA_DEBUG(...)
    #define PANDA_INFO(...)
    #define PANDA_WARN(...)
    #define PANDA_ERROR(...)
    #define PANDA_CRITICAL(...)
#endif
*/